package com.autumn.evaluator;

//
// * 表示 FunctionParam 集合，应用于 call 委托（用户自定义函数），根据表达式函数参数解析传入，以逗号","分隔
//

import com.autumn.util.StringUtils;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;

/**
 * 函数参数集合
 */
public class FunctionParams implements Serializable {

    /**
	 * 序列号
	 */
	private static final long serialVersionUID = -5022048948799674082L;

	public HashMap<Integer, FunctionParam> getFunParams() {
        return funParams;
    }

    private HashMap<Integer, FunctionParam> funParams = new HashMap<>();

    /**
     * 实例化 FunParams 类新实例
     *
     * @param funName
     */
    public FunctionParams(String funName) {
        Function fun = FunctionManager.getFunction(funName);        
        this.setFunction(fun);
    }

    /**
     * 实例化 FunParams 类新实例
     *
     * @param fun 函数
     */
    public FunctionParams(Function fun) {
        this.setFunction(fun);
    }

    /**
     * 获取函数
     */
    private Function function;

    public final Function getFunction() {
        return function;
    }

    private void setFunction(Function value) {
        function = value;
    }

    /**
     * 添加参数
     *
     * @param param 参数
     */
    public final void add(FunctionParam param) {
        param.setParam(this);
        funParams.put(param.getOrderID(), param);
    }

    /**
     * 获取参数数量
     */
    public final int getCount() {
        return this.funParams.size();
    }

    /**
     * 获取参数
     *
     * @param orderID 顺序
     * @return
     */
    public final FunctionParam getItem(int orderID) {
        FunctionParam param;
        if ((param = this.funParams.get(orderID)) != null) {
            return param;
        }
        return null;
    }

    /**
     * 获取参数(每次均会运算)
     *
     * @param name 名称
     * @return
     */
    public final FunctionParam getItem(String name) {
        if (StringUtils.isNullOrBlank(name)) {
            return null;
        }
        for (FunctionParam item : this.funParams.values()) {
            if (item.getName().trim().compareToIgnoreCase(name.trim()) == 0) {
                return item;
            }
        }
        return null;
    }

    /**
     * 循环访问 FunParam 枚举数
     *
     * @return
     */
    public final Iterator<FunctionParam> getEnumerator() {
        return this.funParams.values().iterator();
    }
}